﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Web;
using ABC.Domain.Entities;
using RosService.Data;

namespace ABC.Business.Models
{

    public class NewsModel
    {
        private readonly RosModel rosModel;
        private const string NewsTagsId = "586109";

        public NewsModel(RosModel rosModel)
        {
            this.rosModel = rosModel;
        }

        public string AddNews(Dictionary<string, object> values, HttpPostedFileBase data, string[] addedTags)
        {
            var newId = rosModel.AddEntity("586050", "Новость", values).ToString();
            if (data != null)
            {
                if (data.ContentLength > 0)
                {
                    SetHeaderImage(newId, data);
                }

            }
            UpdateTags(newId, addedTags);
            return newId;
        }

        public void UpdateNews(string id, Dictionary<string, object> values, HttpPostedFileBase data, string[] addedTags)
        {
            DeleteTags(id);
            UpdateTags(id, addedTags);
            foreach (var value in values)
            {
                rosModel.UpdateEntityValue(id, value.Key, value.Value);
            }
            if (data != null)
            {
                if (data.ContentLength > 0)
                {
                    SetHeaderImage(id, data);
                }

            }
        }

        public string SetHeaderImage(string newId, HttpPostedFileBase data)
        {
            var photoId = rosModel.SaveFile(newId, data);
            rosModel.UpdateEntityValue(newId, "СсылкаНаЗаглавнаяКартинка", Convert.ToDecimal(photoId));
            return photoId.ToString();
        }

        public string GetRubricById(string id)
        {
            switch (id)
            {
                case "organization":
                    return "Новости организации";
                case "share":
                    return "Акции и спецпредложения";
                case "partner":
                    return "Новости партнеров";
                case "insurance":
                    return "Новости страхования";
                default: return string.Empty;
            }
        }

        public News GetItemNews(string id)
        {

            var item = rosModel.GetEntityById("Новость", id, new[]
                                         {
                                             "ДатаПубликации", "Анонс", "НазваниеОбъекта",
                                             "СсылкаНаЗаглавнаяКартинка", "Рубрика", "Метки","ТекстДляКнопки"
                                         });


            if (item != null)
            {
                var tags = item["Метки"].ToString().Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
                var result = new News(tags.Length);
                result.Announcement = item["Анонс"].ToString();
                result.Title = item["НазваниеОбъекта"].ToString();
                result.Id = item["id_node"].ToString();
				result.Content = HttpUtility.HtmlDecode(rosModel.GetEntityValue<string>(id, "Содержимое"));
                result.TimeOfPublication =
                    DateTime.Parse(item["ДатаПубликации"].ToString());
                result.HeaderImage = string.Format("{0:F0}", item["СсылкаНаЗаглавнаяКартинка"]);
                result.Rubric = item["Рубрика"].ToString();
                result.TextForButton = item["ТекстДляКнопки"].ToString();
                result.Tags = tags;
                return result;
            }
            return new News();
        }

        public List<News> GetNewsByTag(string tag)
        {
            var newsId = rosModel.GetEntityValue<string>(NewsTagsId, string.Format("{0}{1}", "Метка_", tag)).Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
            var result = new List<News>();
            foreach (var id in newsId)
            {
                var item = rosModel.GetEntityById("Новость", id,
                                                  new Dictionary<string, object> { { "Опубликовать", true.ToString() } },
                                                  new[]
                                                      {
                                                          "ДатаПубликации", "Анонс", "НазваниеОбъекта",
                                                          "СсылкаНаЗаглавнаяКартинка", "Рубрика","ТекстДляКнопки"
                                                      });
                if (item != null)
                {
                    result.Add(new News
                                   {
                                       Announcement = item["Анонс"].ToString(),
                                       Title = item["НазваниеОбъекта"].ToString(),
                                       Id = item["id_node"].ToString(),
									   Content = HttpUtility.HtmlDecode(rosModel.GetEntityValue<string>(id, "Содержимое")),
                                       TimeOfPublication =
                                           DateTime.Parse(item["ДатаПубликации"].ToString()),
                                       HeaderImage = string.Format("{0:F0}", item["СсылкаНаЗаглавнаяКартинка"]),
                                       Rubric = item["Рубрика"].ToString(),
                                       TextForButton = item["ТекстДляКнопки"].ToString()
                                   });
                }
            }
            return result.OrderByDescending(x => x.TimeOfPublication).ToList();
        }

        public List<Tag> GetTop10Tags()
        {
            var listTags = GetTags().Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries).Select(t => new Tag
            {
                Name = t,
                ListId = rosModel.GetEntityValue<string>(NewsTagsId, string.Format("{0}{1}", "Метка_", t))
            });
            var result = listTags.OrderByDescending(x => x.ListId.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries).Length).Take(10).ToList();
            return result;
        }

        public List<News> GetNewsForGeneralPage()
        {
            var filters = new Dictionary<string, object>();
            filters.Add("Опубликовать", true.ToString());
            var news =
                rosModel.GetEntities("Новость", "586050", new Dictionary<string, Query.НаправлениеСортировки> { { "ДатаПубликации", Query.НаправлениеСортировки.Desc } }, filters,
                                     new[]
                                         {
                                             "ДатаПубликации", "Анонс", "НазваниеОбъекта"
                                         }, 3).AsEnumerable();
            return news.Select(item => new News
                                           {
                                               Announcement = item["Анонс"].ToString(),
                                               Title = item["НазваниеОбъекта"].ToString(),
                                               Id = item["id_node"].ToString(),
                                               TimeOfPublication = DateTime.Parse(item["ДатаПубликации"].ToString())
                                           }).ToList();
        }
        public List<News> GetNews(string id, string date)
        {
            var filters = new Dictionary<string, object>();
            if (!string.IsNullOrEmpty(id))
            {
                filters.Add("Рубрика", GetRubricById(id));
            }
            if (!string.IsNullOrEmpty(date))
            {
                filters.Add("ДатаПубликации", DateTime.Parse(date));
            }
            filters.Add("Опубликовать", true.ToString());
            var news =
                rosModel.GetEntities("Новость", "586050", new Dictionary<string, Query.НаправлениеСортировки> { { "ДатаПубликации", Query.НаправлениеСортировки.Desc } }, filters,
                                     new[]
                                         {
                                             "ДатаПубликации", "Анонс", "НазваниеОбъекта",
                                             "СсылкаНаЗаглавнаяКартинка", "Рубрика", "ТекстДляКнопки"
                                         }).AsEnumerable();

            return news.Select(item => new News
                                           {
                                               Announcement = item["Анонс"].ToString(),
                                               Title = item["НазваниеОбъекта"].ToString(),
                                               Id = item["id_node"].ToString(),
											   Content = HttpUtility.HtmlDecode(rosModel.GetEntityValue<string>(id, "Содержимое")),
                                               TimeOfPublication =
                                                   DateTime.Parse(item["ДатаПубликации"].ToString()),
                                               HeaderImage = string.Format("{0:F0}", item["СсылкаНаЗаглавнаяКартинка"]),
                                               Rubric = item["Рубрика"].ToString(),
                                               TextForButton = item["ТекстДляКнопки"].ToString()
                                           }).ToList();
        }

        public List<News> GetActionsForGeneralPage()
        {
            var filters = new Dictionary<string, object>();
            filters.Add("Опубликовать", true.ToString());
            filters.Add("Рубрика", "Акции и спецпредложения");
            var actions =
                rosModel.GetEntitiesActions("Новость", "Новости", "ДатаПубликации", Query.НаправлениеСортировки.Desc,
                                            filters,
                                            new[]
                                                {
                                                    "ДатаПубликации", "Анонс", "Содержимое", "НазваниеОбъекта",
                                                    "СсылкаНаЗаглавнаяКартинка", "Рубрика", "ТекстДляКнопки"
                                                }).AsEnumerable();

            return actions.Select(item => new News
            {
                Announcement = item["Анонс"].ToString(),
                Title = item["НазваниеОбъекта"].ToString(),
                Id = item["id_node"].ToString(),
                Content = HttpUtility.HtmlDecode(item["Содержимое"].ToString()),
                TimeOfPublication =
                    DateTime.Parse(item["ДатаПубликации"].ToString()),
                HeaderImage = string.Format("{0:F0}", item["СсылкаНаЗаглавнаяКартинка"]),
                Rubric = item["Рубрика"].ToString(),
                TextForButton = item["ТекстДляКнопки"].ToString()
            }).ToList();
        }

        public string GetTags()
        {
            return rosModel.GetEntityValue<string>(NewsTagsId, "СписокМеток");
        }


        public List<Tag> GetListTags()
        {
            var listTags = GetTags().Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
            return listTags.Select(t => new Tag
                                            {
                                                Name = t,
                                                ListId = rosModel.GetEntityValue<string>(NewsTagsId, string.Format("{0}{1}", "Метка_", t))
                                            }).ToList();
        }

        public void SetTag(string field, object value)
        {
            rosModel.UpdateEntityValue(NewsTagsId, field, value);
        }

        public TableValue GetNewsForAdmin(Dictionary<string, object> filters, int numberOfOutputData = 0, int page = -1)
        {
            return rosModel.GetEntities("Новость", "586050", new Dictionary<string, Query.НаправлениеСортировки> { { "ДатаПубликации", Query.НаправлениеСортировки.Desc } }, filters,
                                        new[]
                                            {
                                                "ДатаПубликации", "Источник", "НазваниеОбъекта",
                                                "СсылкаНаАвтора", "Рубрика", "Опубликовать"
                                            }, numberOfOutputData, page);
        }

        public void DeleteNews(string[] newsId)
        {
            foreach (var id in newsId)
            {
                rosModel.DeleteEntity(id);
                DeleteTags(id);
            }
        }

        public void DeleteTags(string id) //удаляет метки в статическом классе
        {
            var tags = rosModel.GetEntityValue<string>(id, "Метки").Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); // получаю массив старых меток новости с идентификатором id
            foreach (var tag in tags)
            {
                var currentTag = rosModel.GetEntityValue<string>(NewsTagsId, string.Format("{0}{1}", "Метка_", tag));
                SetTag(string.Format("{0}{1}", "Метка_", tag), currentTag.Replace(string.Format(";{0};", id), ";"));
                if (currentTag.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries).Length == 1 && currentTag.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries)[0] == id)
                {
                    SetTag("СписокМеток", rosModel.GetEntityValue<string>(NewsTagsId, "СписокМеток").Replace(string.Format(";{0};", tag), ";"));
                }
            }
        }

        public void UpdateTags(string id, string[] addedTags) //обновляет метки в статическом классе
        {
            var currentTags = GetListTags();
            for (var i = 0; i < addedTags.Length; i++)
            {
                if (currentTags.Any(x => x.Name == addedTags[i]))
                {
                    // ReSharper disable PossibleNullReferenceException
                    SetTag(string.Format("{0}{1}", "Метка_", addedTags[i]), string.Format("{0}{1};", currentTags.Where(x => x.Name == addedTags[i]).FirstOrDefault().ListId, id));
                    // ReSharper restore PossibleNullReferenceException
                }
                else
                {
                    SetTag(string.Format("{0}{1}", "Метка_", addedTags[i]), string.Format(";{0};", id));
                    var listTagsIsStatic = GetTags();
                    SetTag("СписокМеток",
                           string.IsNullOrEmpty(listTagsIsStatic)
                               ? string.Format(";{0}{1};", GetTags(), addedTags[i])
                               : string.Format("{0}{1};", GetTags(), addedTags[i]));
                }
            }
        }
    }
}
